package cn.bearspark.happening.provider.dao.mapper;

import cn.bearspark.framework.redis.starter.buffer.hash.un.RedisHashMapper;
import cn.bearspark.happening.provider.dao.co.BookLiveCO;
import cn.bearspark.happening.provider.dao.po.BookLivePO;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import java.util.Set;

/**
 * 动态的直播预约的数据映射接口
 *
 * @author f
 */
@Mapper
public interface BookLiveMapper extends RedisHashMapper<BookLiveCO> {

    /**
     * 添加预约直播的数据
     *
     * @param bookLivePO 预约直播的数据对象
     */
    @Insert("INSERT INTO t_happening_book_live (book_live_id, anchor_id, title, live_time) VALUES " +
            "(#{bookLiveId}, #{anchorId}, #{title}, #{liveTime})")
    void insert(BookLivePO bookLivePO);

    /**
     * 将预约直播的数据更新成撤销状态
     *
     * @param bookLiveId   预约直播的 id
     * @param userId       撤销预约直播的用户的用户 id，防止别人修改了主播预约的直播
     * @param canceledCode 直播的撤销状态的枚举值
     */
    @Update("UPDATE t_happening_book_live SET canceled = #{canceledCode} " +
            "WHERE book_live_id = #{bookLiveId} AND anchor_id = #{userId}")
    void updateToCanceled(long bookLiveId, long userId, int canceledCode);

    /**
     * 查询预约直播的数据
     *
     * @param bookLiveIdList 待查询的预约直播的 id 集合
     * @return 预约直播的数据集合
     */
    List<BookLivePO> list(List<Long> bookLiveIdList);

    /**
     * 增加指定预约直播的预约人数
     *
     * @param bookLiveId 指定的预约直播 id
     */
    @Update("UPDATE t_happening_book_live SET book_num = book_num + 1 WHERE book_live_id = #{bookLiveId}")
    void incrBookNum(long bookLiveId);

    /**
     * 减少指定预约直播的预约人数
     *
     * @param bookLiveId 指定的预约直播 id
     */
    @Update("UPDATE t_happening_book_live SET book_num = book_num - 1 WHERE book_live_id = #{bookLiveId}")
    void decrBookNum(long bookLiveId);

    @Override
    List<BookLiveCO> listHotData(Set<Long> bookLiveIdSet);

    @Override
    List<BookLiveCO> listData(List<Long> bookLiveIdList);

    /**
     * 删除指定的预约直播信息
     *
     * @param bookLiveId 指定的预约直播 id
     */
    @Delete("DELETE FROM t_happening_book_live WHERE book_live_id = #{bookLiveId}")
    void delete(long bookLiveId);

    /*  TODO
            如果直播正常举行了，就设置预约直播的数据中的 lived
            之后会利用 lived 的值，如果 lived == UNLIVED.getCode()，限制主播一天不能直播，然后一天之后就删除限制
            之后还可以做一个失信名单（需要对 anchor_id 进行分组，所以需要建立索引），统计 lived == UNLIVED.getCode() 的个数，做一个信誉分的机制
     */
}
